﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace CBE.Model
{
    public partial class Promociones : IDataErrorInfo
    {

        /// <summary>
        /// Helper para la validación en la agregación de ventas
        /// </summary>
        public Boolean IsNew { get; set; }

        public Promociones()
            : base()
        {
            this.ID_Promocion = Guid.NewGuid();

            this.FechaInicio = DateTime.Now.Date;
            this.FechaFin = DateTime.Now.Date.AddDays(7);

            this.EsPromocionPublica = true;
            this.NotificaPorMail = false;
            this.NotificaPorSMS = false;

            this.IsNew = true;

            this._propertyChanged += new PropertyChangedEventHandler(Promociones__propertyChanged);
        }

        void Promociones__propertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "EsPromocionPublica")
            {
                if (this.EsPromocionPublica.HasValue && this.EsPromocionPublica.Value)
                {
                    this.TopNumeroClientes = null;
                    this.NotificaPorMail = false;
                    this.NotificaPorSMS = false;
                    this.Clientes.Clear();
                }
            }
            if (e.PropertyName == "ID_Promocion")
            {
                //HACK: reset de la bandera IsNew
                //TODO: ver
                this.IsNew = false;
            }
        }

        #region IDataErrorInfo Members

        public string Error
        {
            get { throw new NotImplementedException(); }
        }

        public string this[string columnName]
        {
            get
            {
                String error = null;

                if (columnName == "Codigo" && String.IsNullOrEmpty(Codigo))
                {
                    error = "El campo Código es de ingreso obligatorio.";
                }
                else if (columnName == "Bonificacion")
                {
                    if (!Bonificacion.HasValue)
                    {
                        error = "El campo Bonificación es de ingreso obligatorio.";
                    }
                    else if (Bonificacion.Value <= 0)
                    {
                        error = "El campo Bonificación debe ser mayor que 0.";
                    }
                }
                else if (columnName == "FechaInicio" && !FechaInicio.HasValue)
                {
                    error = "El campo Fecha de Inicio es de ingreso obligatorio.";
                }
                else if (columnName == "FechaFin" && !FechaFin.HasValue)
                {
                    error = "El campo Fecha de Fin es de ingreso obligatorio.";
                }
                else if (columnName == "Servicios" && Servicios.Count == 0)
                {
                    error = "Debe ingresar al menos un servicio relacionado a la promoción.";
                }
                else if (columnName == "Dias" && Dias.Count == 0)
                {
                    error = "Debe ingresar al menos un día de aplicación de la promoción.";
                }

                return error;
            }
        }

        #endregion

        private String GenerarTextoPromocion(String textoAMostrar)
        {
            var serviciosSTR = new StringBuilder();

            foreach (var item in Servicios)
            {
                serviciosSTR.AppendFormat("{0}, ", item.Descripcion);
            }

            var diasSTR = new StringBuilder();

            foreach (var dias in Dias)
            {
                diasSTR.AppendFormat("{0}, ", dias.Descripcion);
            }

            return String.Format(
                textoAMostrar,
                    Empresa.Nombre,
                    this.Bonificacion.Value,
                    serviciosSTR.ToString().TrimEnd(' ', ','),
                    diasSTR.ToString().TrimEnd(' ', ','));
        }

        public string GetTextoSMS()
        {
            return GenerarTextoPromocion("{0} te invita a aprovechar la promoción del {1}% de descuento en {2}. Los días {3}.");
        }

        public string GetTextoMail()
        {
            return GenerarTextoPromocion(
                @"{0} te invita a aprovechar la promoción del {1}% de descuento en {2}. Los días {3}. 
Vení, te esperamos!");
        }

    }
}